JWT (JSON Web Token) Authentication এর Integration

Java Technologies - স্প্রিং বুট (Spring Boot) Spring Boot এবং Security |
94
94

JWT (JSON Web Token) একটি ওপেন স্ট্যান্ডার্ড যা নিরাপদভাবে তথ্য আদান-প্রদান করার জন্য ব্যবহৃত হয়। এটি একটি ক্রিপ্টোগ্রাফিক সাইনড টোকেন যা ব্যবহারকারীর প্রমাণীকরণ (authentication) এবং অনুমোদন (authorization) পরিচালনায় গুরুত্বপূর্ণ ভূমিকা পালন করে। স্প্রিং বুট (Spring Boot) এর সাথে JWT ব্যবহার করে নিরাপদ REST API তৈরি করা একটি জনপ্রিয় পদ্ধতি। এখানে আমরা দেখব কীভাবে স্প্রিং বুটে JWT Authentication ইন্টিগ্রেট করা যায়।


JWT Authentication এর মূল ধারণা

JWT টোকেন দুটি প্রধান অংশে বিভক্ত:

  1. Header: এই অংশটি টোকেনের ধরন এবং সিগনেচার অ্যালগরিদম নির্ধারণ করে।
  2. Payload: এই অংশটি ব্যবহারকারীর তথ্য ধারণ করে, যেমন ইউজার আইডি, রোল ইত্যাদি।
  3. Signature: টোকেনটির নিরাপত্তা নিশ্চিত করতে এই অংশে একটি সিগনেচার থাকে যা header এবং payload এর সাথে একটি সিক্রেট কী ব্যবহার করে তৈরি হয়।

JWT টোকেন সাধারণত দুটি উদ্দেশ্যে ব্যবহৃত হয়:

  • Authentication: ইউজার লগইন করার পরে টোকেনটি ব্যবহার করে API এক্সেস প্রদান করা।
  • Authorization: ইউজারের রোল এবং অনুমতি যাচাই করা।

স্প্রিং বুটে JWT Authentication Integration

স্প্রিং বুটে JWT Authentication ইন্টিগ্রেট করতে, কিছু গুরুত্বপূর্ণ স্টেপ অনুসরণ করতে হয়। এখানে একটি সাধারণ উদাহরণ দেওয়া হলো, যেখানে স্প্রিং বুট অ্যাপ্লিকেশন তৈরি করা হবে এবং JWT Authentication ব্যবহার করা হবে।


১. প্রজেক্ট ডিপেনডেন্সি যোগ করা

pom.xml ফাইলে প্রয়োজনীয় ডিপেনডেন্সি যোগ করুন:

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-security</artifactId>
</dependency>

<dependency>
    <groupId>io.jsonwebtoken</groupId>
    <artifactId>jjwt</artifactId>
    <version>0.11.5</version>
</dependency>

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-web</artifactId>
</dependency>

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-validation</artifactId>
</dependency>

<dependency>
    <groupId>com.h2database</groupId>
    <artifactId>h2</artifactId>
    <scope>runtime</scope>
</dependency>

এখানে spring-boot-starter-security স্প্রিং সিকিউরিটির জন্য এবং jjwt JWT টোকেন ব্যবহারের জন্য ব্যবহার করা হয়েছে।


২. JWT Utility ক্লাস তৈরি করা

এখন আমরা একটি JWTUtility ক্লাস তৈরি করব, যা JWT টোকেন তৈরি এবং যাচাই করবে।

import io.jsonwebtoken.Claims;
import io.jsonwebtoken.Jwts;
import io.jsonwebtoken.SignatureAlgorithm;
import org.springframework.stereotype.Component;

import java.util.Date;

@Component
public class JWTUtil {

    private String secretKey = "secret"; // সিক্রেট কী যা JWT সাইন করার জন্য ব্যবহৃত হবে

    // JWT টোকেন তৈরি করার পদ্ধতি
    public String generateToken(String username) {
        return Jwts.builder()
                .setSubject(username)
                .setIssuedAt(new Date())
                .setExpiration(new Date(System.currentTimeMillis() + 1000 * 60 * 60)) // 1 ঘণ্টার জন্য টোকেন
                .signWith(SignatureAlgorithm.HS256, secretKey)
                .compact();
    }

    // JWT টোকেন থেকে ব্যবহারকারীর নাম (username) বের করার পদ্ধতি
    public String extractUsername(String token) {
        return extractClaims(token).getSubject();
    }

    // JWT টোকেন থেকে Claims (টোকেনের Payload) বের করার পদ্ধতি
    private Claims extractClaims(String token) {
        return Jwts.parser()
                .setSigningKey(secretKey)
                .parseClaimsJws(token)
                .getBody();
    }

    // টোকেনের বৈধতা যাচাই করার পদ্ধতি
    public Boolean validateToken(String token, String username) {
        String extractedUsername = extractUsername(token);
        return (extractedUsername.equals(username) && !isTokenExpired(token));
    }

    // টোকেনটি মেয়াদ উত্তীর্ণ হয়েছে কিনা তা যাচাই করার পদ্ধতি
    private Boolean isTokenExpired(String token) {
        return extractClaims(token).getExpiration().before(new Date());
    }
}

এই ক্লাসটি generateToken মেথড ব্যবহারকারীর জন্য একটি JWT টোকেন তৈরি করবে এবং validateToken মেথড এটি যাচাই করবে।


৩. JWT Filter ক্লাস তৈরি করা

স্প্রিং সিকিউরিটি কনফিগারেশন ফিল্টার ব্যবহার করে JWT টোকেন যাচাই করা হয়। এখানে একটি JWTFilter ক্লাস তৈরি করা হলো, যা API কলের সময় JWT টোকেনকে পরীক্ষা করবে।

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.security.core.context.SecurityContextHolder;
import org.springframework.stereotype.Component;
import org.springframework.web.filter.OncePerRequestFilter;

import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;

@Component
public class JWTFilter extends OncePerRequestFilter {

    @Autowired
    private JWTUtil jwtUtil;

    @Override
    protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain filterChain)
            throws ServletException, IOException {

        String token = request.getHeader("Authorization");

        if (token != null && token.startsWith("Bearer ")) {
            token = token.substring(7);
            String username = jwtUtil.extractUsername(token);

            if (username != null && SecurityContextHolder.getContext().getAuthentication() == null) {
                if (jwtUtil.validateToken(token, username)) {
                    // Authenticated, set user context here if needed
                }
            }
        }

        filterChain.doFilter(request, response);
    }
}

৪. স্প্রিং সিকিউরিটি কনফিগারেশন

স্প্রিং সিকিউরিটি কনফিগারেশন ব্যবহার করে JWT ফিল্টার সেটআপ করা হবে। SecurityConfig ক্লাসে সিকিউরিটি কনফিগারেশন করা হবে।

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.security.config.annotation.web.builders.HttpSecurity;
import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity;
import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter;

@Configuration
@EnableWebSecurity
public class SecurityConfig extends WebSecurityConfigurerAdapter {

    @Autowired
    private JWTFilter jwtFilter;

    @Override
    protected void configure(HttpSecurity http) throws Exception {
        http.csrf().disable()
                .authorizeRequests()
                .antMatchers("/login", "/register").permitAll()  // Allow public access to these endpoints
                .anyRequest().authenticated()  // All other requests need authentication
                .and()
                .addFilterBefore(jwtFilter, UsernamePasswordAuthenticationFilter.class); // Add JWT filter
    }
}

৫. লগইন API তৈরি করা

লগইন করার জন্য একটি API তৈরি করা হবে, যা সঠিক ইউজারনেম এবং পাসওয়ার্ড হলে JWT টোকেন রিটার্ন করবে।

import org.springframework.web.bind.annotation.*;

@RestController
@RequestMapping("/auth")
public class AuthController {

    @Autowired
    private JWTUtil jwtUtil;

    @PostMapping("/login")
    public String login(@RequestBody UserCredentials credentials) {
        // Validate user credentials (e.g. check in database)
        if (credentials.getUsername().equals("user") && credentials.getPassword().equals("password")) {
            return jwtUtil.generateToken(credentials.getUsername());
        } else {
            throw new RuntimeException("Invalid credentials");
        }
    }
}

সারাংশ

স্প্রিং বুটে JWT Authentication ইন্টিগ্রেট করার জন্য, আমাদের প্রথমে JWT Utility তৈরি করতে হয় যা টোকেন তৈরি ও যাচাই করবে। এরপর JWT Filter ব্যবহার করে টোকেন যাচাই করতে হবে এবং Security Configuration এর মাধ্যমে সিকিউরিটি সেটআপ করতে হবে। এই প্রক্রিয়ার মাধ্যমে, আমরা একটি নিরাপদ এবং স্কেলেবল JWT Authentication সিস্টেম তৈরি করতে পারি যা স্প্রিং বুট REST API এর সাথে ইন্টিগ্রেট করা যাবে।

Content added By
Promotion